﻿using System;
using System.IO;
using System.Text;

namespace 面向对象_FileStream
{
    class Program
    {
        static void Main(string[] args)
        {
            //读取二进制
            string path = @"F:/111/520.txt";
            FileStream F = new FileStream(path, FileMode.OpenOrCreate);
            byte[] b = new byte[1024];
            int Read = F.Read(b, 0, b.Length);
            //Default默认
            //Encoding 编码
            //输出来导致有很多空格，那些空格是我们设定的1024byte的空值
            //Encoding encode 编码 decode 解码 ， default 默认
            string s = Encoding.Default.GetString(b, 0, Read);
            Console.WriteLine(s);
            //for (int i = 0; i < Read; i++)
            //{
            //    //这样获得到的是ASCll码表中的代表数字
            //    Console.WriteLine(b[i]);
            //}
            //Close 关闭流
            F.Close();
            // resource : 资源
            // 使用 using 则不需要开发中自己主动调用 dispose，它会无感知的在使用完毕之后自动释放
            // using : 使用 ； Filemode :文件打开模式； FileAccess : 文件访问权限 
            using (var Ff = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
            {
                string str = "我是帅哥";
                //Encoding编码
                var enc = Encoding.UTF8.GetBytes(str);
                var ls = Ff.Length;
                // position : 位置 ；这里指的是文件流的位置 ,当把文件流的位置指向最后写入数据就不会覆盖前面的信息
                Ff.Position = ls;
                //将str写入给定的文本中
                Ff.Write(enc);
            }
            using var FFf = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read);//读取
            string path1 = "F:/111/666.txt";
            if (File.Exists(path1))
            {
                File.Delete(path1);
            }

            using var Ffs = new FileStream(path1, FileMode.OpenOrCreate, FileAccess.Write);//using可以简化写法
            byte[] by = new byte[4];
            int count1 = 0;
            //代表文件流当前的位置如果小于他本身的长度就进入循环
            while (FFf.Position < FFf.Length)
            {
                count1++;
                Console.WriteLine($"before: Position = {FFf.Position} , Lenght = {FFf.Length}");
                // FileStream.Read 会导致 FileStream.Position 的位置发生偏移
                var count = FFf.Read(by);
                Console.WriteLine($"after : Position = {FFf.Position} , Lenght = {FFf.Length}");
                Console.WriteLine($"我读了 ： {count}  数据！这是第 {count1} 次搬运");
                // 相较于 3.txt ，因为 555.txt 是全新的，所以 不需要对 position 进行初次的偏移
                Ffs.Write(by, 0, count);
            }
        }
    }
}
